package com.hj545.pl.service;

import com.hj545.pl.bean.ConfVO;
import com.hj545.pl.bean.PropertieVO;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public abstract class BizService {

	/* slf4j + log4j2 logger */
	protected final static Logger logger = LoggerFactory.getLogger(BizService.class);

	/** 换行符号  **/
	private final static String NEW_LINE = "\r\n";

	/** 全局项目配置对象  **/
	protected ConfVO conf;

	/** 构造函数  **/
	public BizService() {
	}

	/**
	 * 构造函数
	 * @param conf 全局项目配置对象
	 */
	public BizService(ConfVO conf) {
		this.conf = conf;
	}

	/** 执行配置文件加载方法  **/
	public abstract void execute();

	/**
	 * 把配置数据写入到文件中；
	 * @param filePath 文件路径
	 * @param kvMap 配置对象
	 */
	protected void writePropertiesFile(String filePath, Map<String, PropertieVO> kvMap) {
		String propertiesContent = createPropertiesContent(kvMap);
		writePropertiesFile(filePath, propertiesContent);
	}

	protected void writePropertiesFile(String filePath, String content) {
		try {
			FileUtils.write(new File(filePath), content, "utf-8");
		} catch (IOException e) {
			logger.error("", e);
		}
	}

	/**
	 * 创建配置文件正文
	 * @param kvMap 配置文件对象
	 * @return 配置文件正文
	 */
	protected String createPropertiesContent(Map<String, PropertieVO> kvMap) {
		StringBuilder bud = new StringBuilder();
		String groupName = null;
		for (PropertieVO vo : kvMap.values()) {
			if (Objects.isNull(groupName)) {
				bud.append("# ").append(vo.getProjectName()).append(NEW_LINE);
				bud.append("# ").append(vo.getGroupName()).append(" ************************************************").append(NEW_LINE);
			}

			if (Objects.nonNull(groupName) && !Objects.equals(groupName, vo.getGroupName())) {
				bud.append("# ************************************************").append(NEW_LINE);
				bud.append(NEW_LINE);
				bud.append("# ").append(vo.getGroupName()).append(" ************************************************").append(NEW_LINE);
			}
			bud.append(vo.toString()).append(NEW_LINE);

			groupName = vo.getGroupName();
		}
		return bud.toString();
	}

	/**
	 * 替换defalutList中的值，生成新的对列
	 * @param defaultList  默认全局配置
	 * @param evnList       环境配置
	 * @param pcList        个人电脑配置
	 */
	protected Map<String, PropertieVO> replaceDbData(List<PropertieVO> defaultList,
	                                                 List<PropertieVO> evnList, List<PropertieVO> pcList) {
		Map<String, PropertieVO> map = new LinkedHashMap<String, PropertieVO>(defaultList.size());

		for (PropertieVO vo : defaultList) {
			map.put(vo.getKeyName(), vo);
		}

		for (PropertieVO vo : evnList) {
			map.put(vo.getKeyName(), vo);
		}

		for (PropertieVO vo : pcList) {
			map.put(vo.getKeyName(), vo);
		}
		return map;
	}

	/**
	 * 备份数据库数据成文件
	 */
	public abstract void backupDBData();

	/**
	 * set conf
	 */
	public void setConf(ConfVO conf) {
		this.conf = conf;
	}
}
